package com.ruoyi.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import com.ruoyi.system.domain.Assessment;
import com.ruoyi.system.domain.vo.ScheduleVo;
import com.ruoyi.system.domain.vo.AssessmentVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import com.ruoyi.system.domain.Schedule;

/**
 * 排班信息Mapper接口
 *
 * @author ruoyi
 */
@Mapper
public interface ScheduleMapper extends BaseMapperPlus<ScheduleMapper, Schedule, ScheduleVo> {

    /**
     * 查询排班信息列表
     *
     * @param schedule 排班信息
     * @return 排班列表
     */
    public List<Schedule> selectScheduleList(Schedule schedule);

    /**
     * 根据日期范围查询考勤数据
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 考勤数据列表
     */
    List<Map<String, Object>> selectAttendanceByDateRange(@Param("startDate") String startDate,
                                                          @Param("endDate") String endDate);

    /**
     * 根据警员ID和日期查询考勤数据
     *
     * @param officerId 警员ID
     * @param dutyDate 勤务日期
     * @return 考勤数据
     */
    Map<String, Object> selectAttendanceByOfficerAndDate(@Param("officerId") Long officerId,
                                                         @Param("dutyDate") String dutyDate);

    /**
     * 更新考勤数据
     *
     * @param params 更新参数
     * @return 影响的行数
     */
    int updateAttendance(Map<String, Object> params);

    /**
     * 新增考勤数据
     *
     * @param params 新增参数
     * @return 影响的行数
     */
    int insertAttendance(Map<String, Object> params);

    /**
     * 删除指定日期范围内的考勤数据
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 影响的行数
     */
    int deleteAttendanceByDateRange(@Param("startDate") String startDate,
                                    @Param("endDate") String endDate);

    /**
     * 查询警员当月统计数据
     *
     * @param officerId 警员ID
     * @return 统计数据
     */
    Map<String, Object> selectOfficerMonthStats(@Param("officerId") Long officerId);

    /**
     * 查询警员班次分布
     *
     * @param officerId 警员ID
     * @return 班次分布数据
     */
    List<Map<String, Object>> selectOfficerShiftDistribution(@Param("officerId") Long officerId);

    /**
     * 查询警员月度工时历史
     *
     * @param officerId 警员ID
     * @return 月度工时数据
     */
    List<Map<String, Object>> selectOfficerMonthlyWorkHours(@Param("officerId") Long officerId);

    /**
     * 查询警员考核历史
     *
     * @param officerId 警员ID
     * @return 考核历史数据
     */
    List<Map<String, Object>> selectOfficerAssessmentHistory(@Param("officerId") Long officerId);

    /**
     * 获取警员出勤统计综合信息
     *
     * @param officerId 警员ID
     * @return 出勤统计综合信息
     */
    Map<String, Object> selectOfficerStats(@Param("officerId") Long officerId);

    /**
     * 批量插入排班信息
     *
     * @param scheduleList 排班信息列表
     * @return 结果
     */


    /**
     * 根据警员ID和日期查询排班信息
     *
     * @param officerId 警员ID
     * @param scheduleDate 排班日期
     * @return 排班信息
     */
    Schedule selectScheduleByOfficerAndDate(@Param("officerId") Long officerId, @Param("scheduleDate") String scheduleDate);

    /**
     * 根据日期范围删除排班数据
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 结果
     */
    int deleteScheduleByDateRange(@Param("startDate") String startDate, @Param("endDate") String endDate);

    List<Schedule> queryScheduleList(Schedule schedule);
}
